/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.entidades;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.UniqueConstraint;

/**
 *
 * @author ariel
 */
@Entity
@Table(name = "PACIENTES", uniqueConstraints = @UniqueConstraint(columnNames = {"numeroIdentificacion","tipoDocumento_id"}))
public class Paciente implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "nombres", nullable = false)
    private String nombres;

    @Column(name = "apellidos", nullable = false)
    private String apellidos;

    @Column(name = "numeroIdentificacion", nullable = false)
    private String numeroIdentificacion;
    
    @ManyToOne
    @JoinColumn(name = "tipoDocumento_id", nullable = false)
    private TipoDocumento tipoDocumento;
    
    @ManyToOne
    @JoinColumn(name = "sexo_id", nullable = false)
    private Sexo sexo;
    
    @Column(name = "fechaNacimiento", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date fechaNacimiento;
    
    @Column(name = "ocupacion", nullable = true, columnDefinition="TEXT") // text para permitir ingresar mucho texto
    private String ocupacion;
    
    @Column(name = "domicilio", nullable = true, columnDefinition="TEXT") // text para permitir ingresar mucho texto
    private String domicilio;
    
    @OneToOne
    @JoinColumn(name = "bajaLogica_id", nullable = true)
    private BajaLogicaPaciente bajaLogicaPaciente;
    
    public Paciente() {}
    
    // getter de estado
    public String getEstado() {
        if (bajaLogicaPaciente == null) {
            return "ACTIVO";
        }
        return "INACTIVO";
    }
    
    // getter de edad
    public int getEdad() {
        Calendar fechaNacimientoCal = Calendar.getInstance();
        Calendar fechaActual = Calendar.getInstance();
        
        //Se asigna la fecha recibida a la fecha de nacimiento.
        fechaNacimientoCal.setTime(this.fechaNacimiento);
        //Se restan la fecha actual y la fecha de nacimiento
        int anio = fechaActual.get(Calendar.YEAR)- fechaNacimientoCal.get(Calendar.YEAR);
        int mes = fechaActual.get(Calendar.MONTH)- fechaNacimientoCal.get(Calendar.MONTH);
        int dia = fechaActual.get(Calendar.DATE)- fechaNacimientoCal.get(Calendar.DATE);
        //Se ajusta el año dependiendo el mes y el día
        if (mes < 0 || ( mes == 0 && dia < 0) ){
            anio--;
        }
        //Regresa la edad en base a la fecha de nacimiento
        return anio;
    }

    public Long getId() {
        return id;
    }

    // GENERADO!!! comentar???
    public void setId(Long id) {
        this.id = id;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getNumeroIdentificacion() {
        return numeroIdentificacion;
    }

    public void setNumeroIdentificacion(String numeroIdentificacion) {
        this.numeroIdentificacion = numeroIdentificacion;
    }

    public TipoDocumento getTipoDocumento() {
        return tipoDocumento;
    }

    public void setTipoDocumento(TipoDocumento tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    public Sexo getSexo() {
        return sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public String getOcupacion() {
        return ocupacion;
    }

    public void setOcupacion(String ocupacion) {
        this.ocupacion = ocupacion;
    }

    public String getDomicilio() {
        return domicilio;
    }

    public void setDomicilio(String domicilio) {
        this.domicilio = domicilio;
    }

    public BajaLogicaPaciente getBajaLogicaPaciente() {
        return bajaLogicaPaciente;
    }

    public void setBajaLogicaPaciente(BajaLogicaPaciente bajaLogicaPaciente) {
        this.bajaLogicaPaciente = bajaLogicaPaciente;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 79 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Paciente other = (Paciente) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Paciente{" + "id=" + id + ", nombres=" + nombres + ", apellidos=" + apellidos + ", numeroIdentificacion=" + numeroIdentificacion + ", tipoDocumento=" + tipoDocumento + ", sexo=" + sexo + ", fechaNacimiento=" + fechaNacimiento + ", ocupacion=" + ocupacion + ", domicilio=" + domicilio + '}';
    }
    
}
